<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var Days = function (weights, days) {
      const n = weights.length;
      //先确定左右边界 
      //由于题目不允许拆分包裹，所以left 只能按照包裹最大值计算
      //由于最快就是1天运载完成，所以是weights的总和
      let left = Math.max(...weights);
      let right = weights.reduce((a, b) => a + b);
      while (left < right) {
        let acc = 0;//记录单日运载量
        let cost_day = 1;//需要运载的天数
        //置初始值为1的原因:
        //如果最后一趟剩下的包裹重量和达不到 > mid的情况
        //就不会执行cost_day++的操作，但这样就相当最后剩下的包裹都丢弃了
        let mid = Math.floor(left + (right - left) / 2);//mid向下取整
        for (let i = 0; i < n; i++) {
          //if中的条件要注意，如果acc和当前指向的weights[i]和 
          //会大于mid的话 说明达到单次运载能力 执行清零和天数加1的操作
          if (acc + weights[i] > mid) {
            cost_day++;
            acc = 0;
          }
          acc += weights[i];
        }
        //这个地方cost_day <= days也要注意
        //if中的条件说明，运载速度太快，相当于是nums[mid] > target 了
        if (cost_day <= days) {
          right = mid;
          //要求最低运载能力，所以===不能直接返回，要继续缩小左边界
        } else {
          left = mid + 1;
        }
      }
      return left;
      //while退出条件是left===right 所以返回left或者right都可以
    };
    console.log(Days(weights = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], days = 5))
  </script>
</body>

</html>